home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-11-08 | 21.0 KB | 609 lines | [TEXT/MPS ] |
- //========================================================================================
- //
- // File: DrawCmds.cpp
- // Release Version: $ 1.0d11 $
- //
- // Author: Mary Boetcher
- //
- // Copyright: © 1993, 1995 by Apple Computer, Inc., all rights reserved.
- //
- //========================================================================================
-
- #include "ODFDraw.hpp"
-
- #ifndef DRAWCMDS_H
- #include "DrawCmds.h"
- #endif
-
- #ifndef DRAWPART_H
- #include "DrawPart.h"
- #endif
-
- #ifndef DRAWSEL_H
- #include "DrawSel.h"
- #endif
-
- #ifndef DRAWCLIP_H
- #include "DrawClip.h"
- #endif
-
- #ifndef BASESHP_H
- #include "BaseShp.h"
- #endif
-
- #ifndef DRAWFRM_H
- #include "DrawFrm.h"
- #endif
-
- // ----- FrameWork Includes -----
-
- #ifndef FWPRESEN_H
- #include "FWPresen.h"
- #endif
-
- #ifndef FWMEMMGR_H
- #include "FWMemMgr.h"
- #endif
-
- #ifndef SOM_ODShape_xh
- #include <Shape.xh>
- #endif
-
-
- //========================================================================================
- // RunTime Info
- //========================================================================================
-
- #ifdef FW_BUILD_MAC
- #pragma segment odfdrawcommand
- #endif
-
- //========================================================================================
- // CDrawShapeCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CDrawShapeCommand constructor
- //----------------------------------------------------------------------------------------
- CDrawShapeCommand::CDrawShapeCommand(Environment* ev,
- CDrawPart* part,
- FW_CFrame* frame,
- CDrawSelection* selection,
- CBaseShape* newShape) :
- #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
- FW_CCommand(ev, cDrawShapeCommand, frame, FW_kCantUndo),
- #else
- FW_CCommand(ev, cDrawShapeCommand, frame, FW_kCanUndo),
- #endif
- fDrawPart(part),
- fDrawSelection(selection),
- fNewShape(newShape)
- {
- this->SetMenuStrings(ev, "Undo Drawing", "Redo Drawing");
- }
-
- //----------------------------------------------------------------------------------------
- // CDrawShapeCommand destructor
- //----------------------------------------------------------------------------------------
- CDrawShapeCommand::~CDrawShapeCommand()
- {
- }
-
- //----------------------------------------------------------------------------------------
- // CDrawShapeCommand::CommitUndone
- //----------------------------------------------------------------------------------------
- void CDrawShapeCommand::CommitUndone(Environment* ev)
- {
- // Delete the new shape only if the drawing was undone
- delete fNewShape;
- }
-
- //----------------------------------------------------------------------------------------
- // CDrawShapeCommand::DoIt
- //----------------------------------------------------------------------------------------
- void CDrawShapeCommand::DoIt(Environment* ev) // Override
- {
- fDrawPart->AddShape(ev, fNewShape);
- }
-
- //----------------------------------------------------------------------------------------
- // CDrawShapeCommand::UndoIt
- //----------------------------------------------------------------------------------------
- void CDrawShapeCommand::UndoIt(Environment* ev) // Override
- {
- // First select the shape
- this->SelectSavedShape(ev);
-
- // Now remove the selected shape
- fDrawSelection->ClearSelection(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CDrawShapeCommand::RedoIt
- //----------------------------------------------------------------------------------------
- void CDrawShapeCommand::RedoIt(Environment* ev) // Override
- {
- fDrawPart->AddShape(ev, fNewShape);
- this->SelectSavedShape(ev); // select and redraw the shape
- }
-
- //----------------------------------------------------------------------------------------
- // CDrawShapeCommand::SelectSavedShape
- //----------------------------------------------------------------------------------------
- void CDrawShapeCommand::SelectSavedShape(Environment* ev)
- {
- // Add the saved shape to the selection
- fDrawSelection->CloseSelection(ev); // first make sure selection is empty
- fDrawSelection->AddToSelection(ev, fNewShape, FALSE);
- fDrawSelection->RedrawShape(ev, fNewShape);
- }
-
- //========================================================================================
- // CResizeShapeCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand constructor
- //----------------------------------------------------------------------------------------
- CResizeShapeCommand::CResizeShapeCommand(Environment* ev,
- CDrawPart* part,
- FW_CFrame* frame,
- CDrawSelection* selection,
- const FW_CRect& srcRect,
- const FW_CRect& dstRect) :
- #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
- FW_CCommand(ev, cResizeCommand, frame, FW_kCantUndo),
- #else
- FW_CCommand(ev, cResizeCommand, frame, FW_kCanUndo),
- #endif
- fDrawPart(part),
- fFrame(frame),
- fDrawSelection(selection),
- fSourceRect(srcRect),
- fDestRect(dstRect),
- fUpdateShape(NULL)
- {
- fChangedShapeList = new FW_CPrivOrderedCollection;
-
- this->SetMenuStrings(ev, "Undo Resize", "Redo Resize");
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand destructor
- //----------------------------------------------------------------------------------------
- CResizeShapeCommand::~CResizeShapeCommand()
- {
- delete fChangedShapeList;
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::DoIt
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::DoIt(Environment* ev) // Override
- {
- this->SaveUndoState(ev);
-
- fDrawSelection->MapSelection(ev, fSourceRect, fDestRect);
- this->Redraw(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::UndoIt
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::UndoIt(Environment* ev) // Override
- {
- // First select the changed shapes
- this->SelectChangedShapes(ev);
-
- fDrawSelection->MapSelection(ev, fDestRect, fSourceRect); // ???
- this->Redraw(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::RedoIt
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::RedoIt(Environment* ev) // Override
- {
- // First select the changed shapes
- this->SelectChangedShapes(ev);
-
- fDrawSelection->MapSelection(ev, fSourceRect, fDestRect);
- this->Redraw(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CResizeShapeCommand::SaveUndoState(Environment* ev) // Override
- {
- // Copy selected shape pointers to fChangedShapeList
- FW_COrderedCollectionIterator ite(fDrawSelection->GetSelectionCollection());
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- fChangedShapeList->AddLast(shape);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::Redraw
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::Redraw(Environment* ev)
- {
- FW_CPresentation* presentation = fFrame->GetPresentation(ev);
- CDrawFacetClipper facetClipper(ev, fDrawPart);
-
- if (fUpdateShape) // UndoIt, RedoIt
- {
- fUpdateShape->Union(ev, fDrawSelection->GetUpdateShape());
- presentation->Invalidate(ev, fUpdateShape);
-
- facetClipper.Clip(ev, presentation, fUpdateShape);
-
- fUpdateShape->Release(ev);
- fUpdateShape = NULL;
- }
- else // DoIt
- {
- presentation->Invalidate(ev, fDrawSelection->GetUpdateShape());
-
- facetClipper.Clip(ev, presentation, fDrawSelection->GetUpdateShape());
- }
-
- fDrawSelection->SelectionChanged(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::SelectChangedShapes
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::SelectChangedShapes(Environment* ev)
- {
- // First, empty the selection
- fDrawSelection->CloseSelection(ev);
-
- // Add the shapes in fChangedShapeList to fDrawSelection
- FW_COrderedCollectionIterator ite(fChangedShapeList);
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- fDrawSelection->AddToSelection(ev, shape, FALSE);
- }
-
- // Save update shape for Redraw
- fUpdateShape = fDrawSelection->GetUpdateShape()->Copy(ev);
- }
-
- //========================================================================================
- // CChangeShapeCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand constructor
- //----------------------------------------------------------------------------------------
-
- CChangeShapeCommand::CChangeShapeCommand(Environment* ev,
- ODCommandID id,
- CDrawPart* part,
- FW_CFrame* frame,
- CDrawSelection* selection)
- #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
- : FW_CCommand(ev, id, frame, FW_kCantUndo),
- #else
- : FW_CCommand(ev, id, frame, FW_kCanUndo),
- #endif
- fDrawPart(part),
- fDrawSelection(selection)
- {
- fChangedShapeList = new FW_CPrivOrderedCollection;
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand destructor
- //----------------------------------------------------------------------------------------
-
- CChangeShapeCommand::~CChangeShapeCommand()
- {
- delete fChangedShapeList;
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::SelectChangedShapes
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::SelectChangedShapes(Environment* ev)
- {
- // First, empty the selection
- fDrawSelection->CloseSelection(ev);
-
- // Add the shapes in fChangedShapeList to fDrawSelection
- FW_COrderedCollectionIterator ite(fChangedShapeList);
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- fDrawSelection->AddToSelection(ev, shape, FALSE);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::DoIt
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::DoIt(Environment* ev) // Override
- {
- this->SaveUndoState(ev);
- this->DoChange(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::UndoIt
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::UndoIt(Environment* ev) // Override
- {
- this->SelectChangedShapes(ev);
-
- // Iterate through shapes in fChangedShapeList, undoing each change
- FW_COrderedCollectionIterator ite(fChangedShapeList);
- unsigned long index = 0;
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- this->UndoShape(ev, shape, index);
- fDrawSelection->RedrawShape(ev, shape);
- index++;
- }
-
- fDrawSelection->SelectionChanged(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::RedoIt
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::RedoIt(Environment* ev) // Override
- {
- this->SelectChangedShapes(ev);
- this->DoChange(ev);
- fDrawSelection->SelectionChanged(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::SaveUndoState(Environment* ev) // Override
- {
- // Copy selected shape pointers to fChangedShapeList
- FW_COrderedCollectionIterator ite(fDrawSelection->GetSelectionCollection());
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- fChangedShapeList->AddLast(shape);
- }
- }
-
- //========================================================================================
- // CChangeColorCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand constructor
- //----------------------------------------------------------------------------------------
-
- CChangeColorCommand::CChangeColorCommand(Environment* ev,
- ODCommandID commandID,
- CDrawPart* part,
- FW_CFrame* frame,
- CDrawSelection* selection,
- const FW_CColor& newColor)
- : CChangeShapeCommand(ev, commandID, part, frame, selection),
- fNewColor(newColor),
- fOldColors(NULL),
- fIsFill(commandID == cChangeFillColor)
- {
- if (fIsFill)
- this->SetMenuStrings(ev, "Undo Fill Color Change", "Redo Fill Color Change");
- else
- this->SetMenuStrings(ev, "Undo Frame Color Change", "Redo Frame Color Change");
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand destructor
- //----------------------------------------------------------------------------------------
-
- CChangeColorCommand::~CChangeColorCommand()
- {
- FW_CMemoryManager::FreeBlock(fOldColors);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand::DoChange
- //----------------------------------------------------------------------------------------
-
- void CChangeColorCommand::DoChange(Environment* ev) // Override
- {
- fDrawSelection->ChangeSelectionColor(ev, fNewColor, fIsFill);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand::UndoShape
- //----------------------------------------------------------------------------------------
-
- void CChangeColorCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index) // Override
- {
- if (fIsFill)
- shape->ChangeFillColor(ev, fDrawPart, fOldColors[index]);
- else
- shape->ChangeFrameColor(ev, fDrawPart, fOldColors[index]);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CChangeColorCommand::SaveUndoState(Environment* ev) // Override
- {
- CChangeShapeCommand::SaveUndoState(ev); // sets up fChangedShapeList
-
- // Create array to hold colors
- unsigned long shapeCount = fChangedShapeList->Count();
- fOldColors = (FW_CColor*)FW_CMemoryManager::AllocateBlock(sizeof(FW_CColor) * shapeCount);
-
- // Save shapes' colors
- FW_CColor color;
- short index = 0;
- FW_COrderedCollectionIterator ite(fChangedShapeList);
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- shape->GetColor(fIsFill, color);
- fOldColors[index] = color;
- index++;
- }
- }
-
- //========================================================================================
- // class CChangePatternCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand constructor
- //----------------------------------------------------------------------------------------
-
- CChangePatternCommand::CChangePatternCommand(Environment* ev,
- ODCommandID commandID,
- CDrawPart* part,
- FW_CFrame* frame,
- CDrawSelection* selection,
- const FW_PPattern& newPattern)
- : CChangeShapeCommand(ev, commandID, part, frame, selection),
- fNewPattern(newPattern),
- fOldPatterns(NULL),
- fCount(0),
- fIsFill(commandID == cChangeFillPattern)
- {
- if (fIsFill)
- this->SetMenuStrings(ev, "Undo Fill Pattern Change", "Redo Fill Pattern Change");
- else
- this->SetMenuStrings(ev, "Undo Frame Pattern Change", "Redo Frame Pattern Change");
-
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand destructor
- //----------------------------------------------------------------------------------------
-
- CChangePatternCommand::~CChangePatternCommand()
- {
- FW_START_DESTRUCTOR
-
- delete [] fOldPatterns;
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand::DoChange
- //----------------------------------------------------------------------------------------
-
- void CChangePatternCommand::DoChange(Environment* ev) // Override
- {
- fDrawSelection->ChangeSelectionPattern(ev, fNewPattern, fIsFill);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand::UndoShape
- //----------------------------------------------------------------------------------------
-
- void CChangePatternCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index) // Override
- {
- if (fIsFill)
- shape->ChangeFillPattern(ev, fDrawPart, fOldPatterns[index]);
- else
- shape->ChangeFramePattern(ev, fDrawPart, fOldPatterns[index]);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CChangePatternCommand::SaveUndoState(Environment* ev) // Override
- {
- CChangeShapeCommand::SaveUndoState(ev); // sets up fChangedShapeList
-
- // Create array to hold patterns
- fOldPatterns = new FW_PPattern[fChangedShapeList->Count()];
-
- // Save shapes' patterns
- FW_COrderedCollectionIterator ite(fChangedShapeList);
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- fOldPatterns[fCount] = shape->GetPattern(fIsFill)->Copy();
- fCount++;
- }
- }
-
- //========================================================================================
- // class CChangeRenderVerbCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand constructor
- //----------------------------------------------------------------------------------------
-
- CChangeRenderVerbCommand::CChangeRenderVerbCommand(Environment* ev,
- CDrawPart* part,
- FW_CFrame* frame,
- CDrawSelection* selection,
- unsigned short newRenderVerb)
- : CChangeShapeCommand(ev, cChangeRenderVerb, part, frame, selection),
- fNewRenderVerb(newRenderVerb),
- fOldRenderVerbs(NULL)
- {
- this->SetMenuStrings(ev, "Undo Render Verb Change", "Redo Render Verb Change");
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand destructor
- //----------------------------------------------------------------------------------------
-
- CChangeRenderVerbCommand::~CChangeRenderVerbCommand()
- {
- delete [] fOldRenderVerbs;
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand::DoChange
- //----------------------------------------------------------------------------------------
-
- void CChangeRenderVerbCommand::DoChange(Environment* ev) // Override
- {
- fDrawSelection->ChangeSelectionRenderVerb(ev, fNewRenderVerb);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand::UndoShape
- //----------------------------------------------------------------------------------------
-
- void CChangeRenderVerbCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index) // Override
- {
- shape->ChangeRenderVerb(ev, fDrawPart, fOldRenderVerbs[index]);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CChangeRenderVerbCommand::SaveUndoState(Environment* ev) // Override
- {
- CChangeShapeCommand::SaveUndoState(ev); // sets up fChangedShapeList
-
- // Create array to hold render verbs
- unsigned long shapeCount = fChangedShapeList->Count();
- fOldRenderVerbs = new unsigned short[shapeCount];
-
- // Finally, save shapes' render verbs
- unsigned short verb;
- short index = 0;
- FW_COrderedCollectionIterator ite(fChangedShapeList);
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- verb = shape->GetRenderVerb();
- fOldRenderVerbs[index] = verb;
- }
- }
-